... and gtk_css_parser_has_function().
{
GtkCssValue *x, *y;
- if (_gtk_css_parser_try (parser, "cover", TRUE))
+ if (gtk_css_parser_try_ident (parser, "cover"))
return _gtk_css_value_ref (&cover_singleton);
- else if (_gtk_css_parser_try (parser, "contain", TRUE))
+ else if (gtk_css_parser_try_ident (parser, "contain"))
return _gtk_css_value_ref (&contain_singleton);
- if (_gtk_css_parser_try (parser, "auto", TRUE))
+ if (gtk_css_parser_try_ident (parser, "auto"))
x = NULL;
else
{
return NULL;
}
- if (_gtk_css_parser_try (parser, "auto", TRUE))
+ if (gtk_css_parser_try_ident (parser, "auto"))
y = NULL;
else if (!gtk_css_number_value_can_parse (parser))
y = NULL;
result = _gtk_css_border_value_new (NULL, NULL, NULL, NULL);
if (allow_fill)
- result->fill = _gtk_css_parser_try (parser, "fill", TRUE);
+ result->fill = gtk_css_parser_try_ident (parser, "fill");
for (i = 0; i < 4; i++)
{
- if (allow_auto && _gtk_css_parser_try (parser, "auto", TRUE))
+ if (allow_auto && gtk_css_parser_try_ident (parser, "auto"))
continue;
if (!gtk_css_number_value_can_parse (parser))
}
if (allow_fill && !result->fill)
- result->fill = _gtk_css_parser_try (parser, "fill", TRUE);
+ result->fill = gtk_css_parser_try_ident (parser, "fill");
for (; i < 4; i++)
{
const char *names[] = {"rgba", "rgb", "lighter", "darker", "shade", "alpha", "mix"};
char *name;
- if (_gtk_css_parser_try (parser, "currentColor", TRUE))
+ if (gtk_css_parser_try_ident (parser, "currentColor"))
return _gtk_css_color_value_new_current_color ();
- if (_gtk_css_parser_try (parser, "transparent", TRUE))
+ if (gtk_css_parser_try_ident (parser, "transparent"))
{
GdkRGBA transparent = { 0, 0, 0, 0 };
static const struct {
const char *name;
guint is_bezier :1;
- guint needs_custom :1;
+ guint is_function :1;
double values[4];
} parser_values[] = {
{ "linear", TRUE, FALSE, { 0.0, 0.0, 1.0, 1.0 } },
for (i = 0; i < 4; i++)
{
- if (!_gtk_css_parser_try (parser, i ? "," : "(", TRUE))
+ if (!_gtk_css_parser_try (parser, i ? "," : "cubic-bezier(", TRUE))
{
_gtk_css_parser_error (parser, "Expected '%s'", i ? "," : "(");
return NULL;
int n_steps;
gboolean start;
- if (!_gtk_css_parser_try (parser, "(", TRUE))
+ if (!_gtk_css_parser_try (parser, "steps(", TRUE))
{
_gtk_css_parser_error (parser, "Expected '('");
return NULL;
if (_gtk_css_parser_try (parser, ",", TRUE))
{
- if (_gtk_css_parser_try (parser, "start", TRUE))
+ if (gtk_css_parser_try_ident (parser, "start"))
start = TRUE;
- else if (_gtk_css_parser_try (parser, "end", TRUE))
+ else if (gtk_css_parser_try_ident (parser, "end"))
start = FALSE;
else
{
for (i = 0; i < G_N_ELEMENTS (parser_values); i++)
{
- if (_gtk_css_parser_try (parser, parser_values[i].name, FALSE))
+ if (parser_values[i].is_function)
{
- if (parser_values[i].needs_custom)
+ if (gtk_css_parser_has_function (parser, parser_values[i].name))
{
if (parser_values[i].is_bezier)
return gtk_css_ease_value_parse_cubic_bezier (parser);
else
return gtk_css_ease_value_parse_steps (parser);
}
-
- _gtk_css_parser_skip_whitespace (parser);
-
- if (parser_values[i].is_bezier)
- return _gtk_css_ease_value_new_cubic_bezier (parser_values[i].values[0],
- parser_values[i].values[1],
- parser_values[i].values[2],
- parser_values[i].values[3]);
- else
- return _gtk_css_ease_value_new_steps (parser_values[i].values[0],
- parser_values[i].values[1] != 0.0);
+ }
+ else
+ {
+ if (gtk_css_parser_try_ident (parser, parser_values[i].name))
+ {
+ if (parser_values[i].is_bezier)
+ return _gtk_css_ease_value_new_cubic_bezier (parser_values[i].values[0],
+ parser_values[i].values[1],
+ parser_values[i].values[2],
+ parser_values[i].values[3]);
+ else
+ return _gtk_css_ease_value_new_steps (parser_values[i].values[0],
+ parser_values[i].values[1] != 0.0);
+ }
}
}
for (i = 0; i < G_N_ELEMENTS (border_style_values); i++)
{
- if (_gtk_css_parser_try (parser, border_style_values[i].name, TRUE))
+ if (gtk_css_parser_try_ident (parser, border_style_values[i].name))
return _gtk_css_value_ref (&border_style_values[i]);
}
for (i = 0; i < G_N_ELEMENTS (blend_mode_values); i++)
{
- if (_gtk_css_parser_try (parser, blend_mode_values[i].name, TRUE))
+ if (gtk_css_parser_try_ident (parser, blend_mode_values[i].name))
return _gtk_css_value_ref (&blend_mode_values[i]);
}
for (i = 0; i < G_N_ELEMENTS (font_size_values); i++)
{
- if (_gtk_css_parser_try (parser, font_size_values[i].name, TRUE))
+ if (gtk_css_parser_try_ident (parser, font_size_values[i].name))
return _gtk_css_value_ref (&font_size_values[i]);
}
for (i = 0; i < G_N_ELEMENTS (font_style_values); i++)
{
- if (_gtk_css_parser_try (parser, font_style_values[i].name, TRUE))
+ if (gtk_css_parser_try_ident (parser, font_style_values[i].name))
return _gtk_css_value_ref (&font_style_values[i]);
}
for (i = 0; i < G_N_ELEMENTS (font_stretch_values); i++)
{
- if (_gtk_css_parser_try (parser, font_stretch_values[i].name, TRUE))
+ if (gtk_css_parser_try_ident (parser, font_stretch_values[i].name))
return _gtk_css_value_ref (&font_stretch_values[i]);
}
for (i = 0; i < G_N_ELEMENTS (text_decoration_line_values); i++)
{
- if (_gtk_css_parser_try (parser, text_decoration_line_values[i].name, TRUE))
+ if (gtk_css_parser_try_ident (parser, text_decoration_line_values[i].name))
return _gtk_css_value_ref (&text_decoration_line_values[i]);
}
for (i = 0; i < G_N_ELEMENTS (text_decoration_style_values); i++)
{
- if (_gtk_css_parser_try (parser, text_decoration_style_values[i].name, TRUE))
+ if (gtk_css_parser_try_ident (parser, text_decoration_style_values[i].name))
return _gtk_css_value_ref (&text_decoration_style_values[i]);
}
for (i = 0; i < G_N_ELEMENTS (area_values); i++)
{
- if (_gtk_css_parser_try (parser, area_values[i].name, TRUE))
+ if (gtk_css_parser_try_ident (parser, area_values[i].name))
return _gtk_css_value_ref (&area_values[i]);
}
*/
for (i = G_N_ELEMENTS (direction_values) - 1; i >= 0; i--)
{
- if (_gtk_css_parser_try (parser, direction_values[i].name, TRUE))
+ if (gtk_css_parser_try_ident (parser, direction_values[i].name))
return _gtk_css_value_ref (&direction_values[i]);
}
for (i = 0; i < G_N_ELEMENTS (play_state_values); i++)
{
- if (_gtk_css_parser_try (parser, play_state_values[i].name, TRUE))
+ if (gtk_css_parser_try_ident (parser, play_state_values[i].name))
return _gtk_css_value_ref (&play_state_values[i]);
}
for (i = 0; i < G_N_ELEMENTS (fill_mode_values); i++)
{
- if (_gtk_css_parser_try (parser, fill_mode_values[i].name, TRUE))
+ if (gtk_css_parser_try_ident (parser, fill_mode_values[i].name))
return _gtk_css_value_ref (&fill_mode_values[i]);
}
for (i = 0; i < G_N_ELEMENTS (icon_style_values); i++)
{
- if (_gtk_css_parser_try (parser, icon_style_values[i].name, TRUE))
+ if (gtk_css_parser_try_ident (parser, icon_style_values[i].name))
return _gtk_css_value_ref (&icon_style_values[i]);
}
for (i = 0; i < G_N_ELEMENTS (font_kerning_values); i++)
{
- if (_gtk_css_parser_try (parser, font_kerning_values[i].name, TRUE))
+ if (gtk_css_parser_try_ident (parser, font_kerning_values[i].name))
return _gtk_css_value_ref (&font_kerning_values[i]);
}
for (i = 0; i < G_N_ELEMENTS (font_variant_position_values); i++)
{
- if (_gtk_css_parser_try (parser, font_variant_position_values[i].name, TRUE))
+ if (gtk_css_parser_try_ident (parser, font_variant_position_values[i].name))
return _gtk_css_value_ref (&font_variant_position_values[i]);
}
for (i = 0; i < G_N_ELEMENTS (font_variant_caps_values); i++)
{
- if (_gtk_css_parser_try (parser, font_variant_caps_values[i].name, TRUE))
+ if (gtk_css_parser_try_ident (parser, font_variant_caps_values[i].name))
return _gtk_css_value_ref (&font_variant_caps_values[i]);
}
for (i = 0; i < G_N_ELEMENTS (font_variant_alternate_values); i++)
{
- if (_gtk_css_parser_try (parser, font_variant_alternate_values[i].name, TRUE))
+ if (gtk_css_parser_try_ident (parser, font_variant_alternate_values[i].name))
return _gtk_css_value_ref (&font_variant_alternate_values[i]);
}
for (i = 0; i < G_N_ELEMENTS (font_variant_ligature_values); i++)
{
- if (_gtk_css_parser_try (parser, font_variant_ligature_values[i].name, TRUE))
+ if (gtk_css_parser_try_ident (parser, font_variant_ligature_values[i].name))
{
value = font_variant_ligature_values[i].value;
break;
for (i = 0; i < G_N_ELEMENTS (font_variant_numeric_values); i++)
{
- if (_gtk_css_parser_try (parser, font_variant_numeric_values[i].name, TRUE))
+ if (gtk_css_parser_try_ident (parser, font_variant_numeric_values[i].name))
{
value = font_variant_numeric_values[i].value;
break;
for (i = 0; i < G_N_ELEMENTS (font_variant_east_asian_values); i++)
{
- if (_gtk_css_parser_try (parser, font_variant_east_asian_values[i].name, TRUE))
+ if (gtk_css_parser_try_ident (parser, font_variant_east_asian_values[i].name))
{
value = font_variant_east_asian_values[i].value;
break;
char *name;
int num;
- if (_gtk_css_parser_try (parser, "normal", TRUE))
+ if (gtk_css_parser_try_ident (parser, "normal"))
return gtk_css_font_features_value_new_default ();
result = gtk_css_font_features_value_new_empty ();
return NULL;
}
- if (_gtk_css_parser_try (parser, "on", TRUE))
+ if (gtk_css_parser_try_ident (parser, "on"))
val = _gtk_css_number_value_new (1.0, GTK_CSS_NUMBER);
- else if (_gtk_css_parser_try (parser, "off", TRUE))
+ else if (gtk_css_parser_try_ident (parser, "off"))
val = _gtk_css_number_value_new (0.0, GTK_CSS_NUMBER);
else if (_gtk_css_parser_try_int (parser, &num))
val = _gtk_css_number_value_new ((double)num, GTK_CSS_NUMBER);
GtkCssValue *result, *coord;
char *name;
- if (_gtk_css_parser_try (parser, "normal", TRUE))
+ if (gtk_css_parser_try_ident (parser, "normal"))
return gtk_css_font_variations_value_new_default ();
result = gtk_css_font_variations_value_new_empty ();
gtk_css_image_builtin_parse (GtkCssImage *image,
GtkCssParser *parser)
{
- if (!_gtk_css_parser_try (parser, "builtin", TRUE))
+ if (!gtk_css_parser_try_ident (parser, "builtin"))
{
_gtk_css_parser_error (parser, "Expected 'builtin'");
return FALSE;
return FALSE;
}
- if (_gtk_css_parser_try (parser, "to", TRUE))
+ if (gtk_css_parser_try_ident (parser, "to"))
{
for (i = 0; i < 2; i++)
{
- if (_gtk_css_parser_try (parser, "left", TRUE))
+ if (gtk_css_parser_try_ident (parser, "left"))
{
if (linear->side & ((1 << GTK_CSS_LEFT) | (1 << GTK_CSS_RIGHT)))
{
}
linear->side |= (1 << GTK_CSS_LEFT);
}
- else if (_gtk_css_parser_try (parser, "right", TRUE))
+ else if (gtk_css_parser_try_ident (parser, "right"))
{
if (linear->side & ((1 << GTK_CSS_LEFT) | (1 << GTK_CSS_RIGHT)))
{
}
linear->side |= (1 << GTK_CSS_RIGHT);
}
- else if (_gtk_css_parser_try (parser, "top", TRUE))
+ else if (gtk_css_parser_try_ident (parser, "top"))
{
if (linear->side & ((1 << GTK_CSS_TOP) | (1 << GTK_CSS_BOTTOM)))
{
}
linear->side |= (1 << GTK_CSS_TOP);
}
- else if (_gtk_css_parser_try (parser, "bottom", TRUE))
+ else if (gtk_css_parser_try_ident (parser, "bottom"))
{
if (linear->side & ((1 << GTK_CSS_TOP) | (1 << GTK_CSS_BOTTOM)))
{
do {
found_one = FALSE;
- if (!has_shape && _gtk_css_parser_try (parser, "circle", TRUE))
+ if (!has_shape && gtk_css_parser_try_ident (parser, "circle"))
{
radial->circle = TRUE;
found_one = has_shape = TRUE;
}
- else if (!has_shape && _gtk_css_parser_try (parser, "ellipse", TRUE))
+ else if (!has_shape && gtk_css_parser_try_ident (parser, "ellipse"))
{
radial->circle = FALSE;
found_one = has_shape = TRUE;
while (!gtk_css_parser_has_token (parser, GTK_CSS_TOKEN_CLOSE_CURLY))
{
- if (_gtk_css_parser_try (parser, "from", TRUE))
+ if (gtk_css_parser_try_ident (parser, "from"))
progress = 0;
- else if (_gtk_css_parser_try (parser, "to", TRUE))
+ else if (gtk_css_parser_try_ident (parser, "to"))
progress = 1;
else if (_gtk_css_parser_try_double (parser, &progress) &&
_gtk_css_parser_try (parser, "%", TRUE))
return TRUE;
}
+gboolean
+gtk_css_parser_try_ident (GtkCssParser *parser,
+ const char *ident)
+{
+ gsize len;
+
+ g_return_val_if_fail (GTK_IS_CSS_PARSER (parser), FALSE);
+ g_return_val_if_fail (ident != NULL, FALSE);
+
+ len = strlen (ident);
+
+ if (g_ascii_strncasecmp (parser->data, ident, len) != 0 ||
+ parser->data[len] == '(')
+ return FALSE;
+
+ parser->data += len;
+
+ _gtk_css_parser_skip_whitespace (parser);
+
+ return TRUE;
+}
+
static guint
get_xdigit (char c)
{
}
}
+gboolean
+gtk_css_parser_has_function (GtkCssParser *parser,
+ const char *name)
+{
+ gsize len;
+
+ g_return_val_if_fail (GTK_IS_CSS_PARSER (parser), FALSE);
+ g_return_val_if_fail (name != NULL, FALSE);
+
+ len = strlen (name);
+
+ return g_ascii_strncasecmp (parser->data, name, len) == 0 &&
+ parser->data[len] == '(';
+}
+
char *
_gtk_css_parser_read_string (GtkCssParser *parser)
{
const char *prefix);
gboolean gtk_css_parser_has_token (GtkCssParser *parser,
GtkCssTokenType token_type);
+gboolean gtk_css_parser_has_function (GtkCssParser *parser,
+ const char *name);
/* IMPORTANT:
* _try_foo() functions do not modify the data pointer if they fail, nor do they
* however is fine to call if you don’t know yet if the token is a foo or a bar,
* you can _try_bar() if try_foo() failed.
*/
+gboolean gtk_css_parser_try_ident (GtkCssParser *parser,
+ const char *ident);
gboolean _gtk_css_parser_try (GtkCssParser *parser,
const char *string,
gboolean skip_whitespace);
for (first = 0; names[first].name != NULL; first++)
{
- if (_gtk_css_parser_try (parser, names[first].name, TRUE))
+ if (gtk_css_parser_try_ident (parser, names[first].name))
{
if (names[first].horizontal)
{
for (second = 0; names[second].name != NULL; second++)
{
- if (_gtk_css_parser_try (parser, names[second].name, TRUE))
+ if (gtk_css_parser_try_ident (parser, names[second].name))
{
*missing = _gtk_css_number_value_new (names[second].percentage, GTK_CSS_PERCENT);
break;
for (i = 0; i < G_N_ELEMENTS (background_repeat_values); i++)
{
- if (_gtk_css_parser_try (parser, background_repeat_values[i].name, TRUE))
+ if (gtk_css_parser_try_ident (parser, background_repeat_values[i].name))
{
*result = i;
return TRUE;
g_return_val_if_fail (parser != NULL, NULL);
- if (_gtk_css_parser_try (parser, "repeat-x", TRUE))
+ if (gtk_css_parser_try_ident (parser, "repeat-x"))
return _gtk_css_background_repeat_value_new (GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_NO_REPEAT);
- if (_gtk_css_parser_try (parser, "repeat-y", TRUE))
+ if (gtk_css_parser_try_ident (parser, "repeat-y"))
return _gtk_css_background_repeat_value_new (GTK_CSS_REPEAT_STYLE_NO_REPEAT, GTK_CSS_REPEAT_STYLE_REPEAT);
if (!_gtk_css_background_repeat_style_try (parser, &x))
for (i = 0; i < G_N_ELEMENTS (border_repeat_values); i++)
{
- if (_gtk_css_parser_try (parser, border_repeat_values[i].name, TRUE))
+ if (gtk_css_parser_try_ident (parser, border_repeat_values[i].name))
{
*result = i;
return TRUE;
GtkCssValue *value, *result;
GPtrArray *values;
- if (_gtk_css_parser_try (parser, "none", TRUE))
+ if (gtk_css_parser_try_ident (parser, "none"))
return _gtk_css_shadows_value_new_none ();
values = g_ptr_array_new ();
gboolean inset;
guint i;
- if (box_shadow_mode)
- inset = _gtk_css_parser_try (parser, "inset", TRUE);
- else
- inset = FALSE;
+ inset = FALSE;
do
{
else
values[SPREAD] = _gtk_css_number_value_new (0.0, GTK_CSS_PX);
}
- else if (!inset && box_shadow_mode && _gtk_css_parser_try (parser, "inset", TRUE))
+ else if (!inset && box_shadow_mode && gtk_css_parser_try_ident (parser, "inset"))
{
if (values[HOFFSET] == NULL)
goto fail;
{
GtkCssImage *image;
- if (_gtk_css_parser_try (parser, "none", TRUE))
+ if (gtk_css_parser_try_ident (parser, "none"))
image = NULL;
else
{
static GtkCssValue *
_gtk_css_font_variant_value_try_parse (GtkCssParser *parser)
{
- if (_gtk_css_parser_try (parser, "normal", TRUE))
+ if (gtk_css_parser_try_ident (parser, "normal"))
return _gtk_css_ident_value_new ("normal");
- else if (_gtk_css_parser_try (parser, "small-caps", TRUE))
+ else if (gtk_css_parser_try_ident (parser, "small-caps"))
return _gtk_css_ident_value_new ("small-caps");
return NULL;
}
{
GtkCssImage *image;
- if (_gtk_css_parser_try (parser, "none", TRUE))
+ if (gtk_css_parser_try_ident (parser, "none"))
image = NULL;
else
{
{
do
{
- if (values[1] == NULL && _gtk_css_parser_try (parser, "infinite", TRUE))
+ if (values[1] == NULL && gtk_css_parser_try_ident (parser, "infinite"))
{
values[1] = _gtk_css_number_value_new (HUGE_VAL, GTK_CSS_NUMBER);
}
GtkCssValue **values,
GtkCssParser *parser)
{
- if (_gtk_css_parser_try (parser, "normal", TRUE))
+ if (gtk_css_parser_try_ident (parser, "normal"))
{
/* all initial values */
}
- else if (_gtk_css_parser_try (parser, "none", TRUE))
+ else if (gtk_css_parser_try_ident (parser, "none"))
{
/* all initial values, except for font-variant-ligatures */
values[0] = _gtk_css_font_variant_ligature_value_new (GTK_CSS_FONT_VARIANT_LIGATURE_NONE);
{
GtkCssStyleProperty *style_property = GTK_CSS_STYLE_PROPERTY (property);
- if (_gtk_css_parser_try (parser, "initial", TRUE))
+ if (gtk_css_parser_try_ident (parser, "initial"))
{
/* the initial value can be explicitly specified with the
* ‘initial’ keyword which all properties accept.
*/
return _gtk_css_initial_value_new ();
}
- else if (_gtk_css_parser_try (parser, "inherit", TRUE))
+ else if (gtk_css_parser_try_ident (parser, "inherit"))
{
/* All properties accept the ‘inherit’ value which
* explicitly specifies that the value will be determined
*/
return _gtk_css_inherit_value_new ();
}
- else if (_gtk_css_parser_try (parser, "unset", TRUE))
+ else if (gtk_css_parser_try_ident (parser, "unset"))
{
/* If the cascaded value of a property is the unset keyword,
* then if it is an inherited property, this is treated as
{
GtkCssImage *image;
- if (_gtk_css_parser_try (parser, "none", TRUE))
+ if (gtk_css_parser_try_ident (parser, "none"))
image = NULL;
else
{
css_image_value_parse_with_builtin (GtkCssStyleProperty *property,
GtkCssParser *parser)
{
- if (_gtk_css_parser_try (parser, "builtin", TRUE))
+ if (gtk_css_parser_try_ident (parser, "builtin"))
return _gtk_css_image_value_new (gtk_css_image_builtin_new ());
return css_image_value_parse (property, parser);
static GtkCssValue *
iteration_count_parse_one (GtkCssParser *parser)
{
- if (_gtk_css_parser_try (parser, "infinite", TRUE))
+ if (gtk_css_parser_try_ident (parser, "infinite"))
return _gtk_css_number_value_new (HUGE_VAL, GTK_CSS_NUMBER);
return _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_NUMBER | GTK_CSS_POSITIVE_ONLY);